package test;

import java.util.*;

public class MapSet {
    //set当中的元素是不可以重复的
    /**
     * 1.Set是继承自Collection的一个接口嘞
     * 2.Set中只存储key，并要求key一定要唯一
     * 3.TreeSet底层是使用Map实现的，其使用key于Object的一个默认对象作为键值对插入到Map中的
     * 4.Set最大的功能就是对集合中的元素进行去重
     * 5. 实现Set接口的常用类有TreeSet和HashSet，还有一个LinkedHashSet，LinkedHashSet是在HashSet的基础
     * 上维护了一个双向链表来记录元素的插入次序。
     * 6. Set中的Key不能修改，如果要修改，先将原来的删除掉，然后再重新插入
     * 7. TreeSet中不能插入null的key，HashSet可以。
     * 8. TreeSet和HashSet的区别【HashSet在课件最后会讲到】
     * @param args
     */
    public static void main(String[] args) {
        Set<String> set = new TreeSet<>();
        set.add("hello");
        //这里的TreeSet底层是TreeMap,每次存储元素放到map的k上的，因为本身map的key就是不能重复的
        set.add("abdc");
        set.add("abdc");
        set.add("java");

        //用迭代器打印set中的所有内容
        Iterator<String> it = set.iterator();
        //检查it中是否还有元素，返回值是布尔
        while(it.hasNext()) {
            System.out.println(it.next());
        }

        //清空set元素
        set.clear();
        System.out.println();
    }

    public static void main1(String[] args) {
        Map<String,Integer> map = new TreeMap<>();
        //0.Map中存放键值对的Key是唯一的，value是可以重复的
        //1.Key不能为空，因为Map是是可比较的，如果是null会抛出空指针异常
        //2.Map是一个接口，不能直接实例化对象，如果实例化对象只能实例化他的实现类TreeMap或者HashMap
        //3.Map中的Key可以全部分离出来，存储到Set中来进行访问（因为Key不能重复）
        //4.Map中的value可以全部分离出来，存储到Collection的任何一个子集合中（value可能重复）
        //5.Map中键值对的Key不能直接修改，value可以修改，如果要修改Key，只能先将该Key删除，然后再进行重新插入
        map.put("HELLO",2);
        //相同的key会更新value值，key只会存贮一份
        map.put("ABCDF",3);
        map.put("ABCDF",90);
        map.put("ABCDE",4);
        map.put("ABCDG",6);
        System.out.println();
        //找这个串是否存在，如果没找到返回自定义的默认值-1，找到则返回value值
        //System.out.println(map.getOrDefault("ABCD",-1));
        //找这个串是否存在，存在则返回其对应的value值，不存在则返回null
        //System.out.println(map.get("ABCDE"));
        //删除key对应的映射关系，返回值是V
        //System.out.println(map.remove("ABCD"));
        //此时的ABCD字符串已经删除，所以无法找到
        //System.out.println(map.getOrDefault("ABCD",-1));
        //返回所有Key的不重复合集（返回值是set）
        //Set<String> set = map.keySet();
        //返回所有value的可重复合集
        //Collection<Integer> collection = map.values();
        //相当于把map中的所有东西都放到了entrySet里面了（Entry是一个类型）
        Set<Map.Entry<String,Integer>> entrySet = map.entrySet();

        for(Map.Entry<String,Integer> entry : entrySet) {
            System.out.println("Key:"+entry.getKey()+"val:"+entry.getValue());
        }
        System.out.println();
    }
}
